<?php

/*
 * Абстрактный класс элементов данных моделей
 */

namespace T4\MODEL;

use T4\Standard;
use T4\Exception;

abstract class AElement {

    public $name;
    protected $data;
    public $extra;

    final public function __construct($name, $definition) {
        $this->name = $name;
		$this->extra = new Standard;
		if ( isset($definition['default']) ) {
			$this->extra->default = $definition['default'];
		}
    } 

    final public function setData($data) {
        $this->data = $this->validate($data);
    }

    public function getData() {
        return $this->data;
    }

    abstract protected function validate($data);

    protected function error() {
        throw new Exception('Неверный формат данных типа ' . get_called_class());
    }

    public function __toString() {
        return (string) $this->data;
    }

    public function setExtra($name, $value) {
        $this->extra->{$name} = $value;
    }

    /**
     * Магия для доступа к данным через $this->value
     * Полезно в шаблонах
     */
    final public function __get($name) {
        if ('value' == $name) {
            return $this->__toString();
        }
    }

    final public function __isset($name) {
        if ('value' == $name) {
            return true;
        }
    }

    final public function __toForm() {
        $view = new \T4\View(array(__DIR__ . '/elements'));
        $view->assign('element', $this);
        $class = array_pop(explode('\\', get_called_class()));
        return $view->render($class . '.html');
    }

}